package main

import (
	"fmt"
	"time"
)

func main() {
	dataCh := make(chan int)
	closeCh := make(chan bool)

	// 生产者1
	go func() {
		for i := 1; i <= 3; i++ {
			dataCh <- i
			time.Sleep(100 * time.Millisecond)
		}
	}()

	// 生产者2
	go func() {
		for i := 4; i <= 6; i++ {
			dataCh <- i
			time.Sleep(100 * time.Millisecond)
		}
	}()

	// 关闭生产者，发送关闭信号
	go func() {
		time.Sleep(1000 * time.Millisecond) // 等待生产者发送完数据
		closeCh <- true
	}()

	// 主协程处理关闭
	go func() {
		<-closeCh
		close(dataCh)
	}()

	// 消费者读取数据
	for num := range dataCh {
		fmt.Println("收到:", num)
	}
	fmt.Println("数据处理完毕")

	time.Sleep(time.Second * 10)
}

func main2() {
	dataCh := make(chan int)
	closeCh := make(chan bool)

	// 生产者1
	go func() {
		for i := 1; i <= 3; i++ {
			dataCh <- i
			time.Sleep(100 * time.Millisecond)
		}
	}()

	// 生产者2
	go func() {
		for i := 4; i <= 6; i++ {
			dataCh <- i
			time.Sleep(100 * time.Millisecond)
		}
	}()

	// 关闭生产者，发送关闭信号
	go func() {
		time.Sleep(1 * time.Millisecond) // 等待生产者发送完数据
		closeCh <- true
	}()

	// 主协程处理关闭
	go func() {
		<-closeCh
		close(dataCh)
	}()

	// 消费者读取数据
	for num := range dataCh {
		fmt.Println("收到:", num)
	}
	fmt.Println("数据处理完毕")

	time.Sleep(time.Second * 10)
}

//var c int64 = 1
//
//func main() {
//	wg := &sync.WaitGroup{}
//
//	wg.Add(3)
//
//	go printNumber(wg, 1, 1)
//	go printNumber(wg, 2, 2)
//	go printNumber(wg, 3, 0)
//
//	// 等待所有协程完成
//	wg.Wait()
//
//}
//
//func printNumber(wg *sync.WaitGroup, n, k int) {
//	defer wg.Done()
//	a := 0
//	for {
//		if int(atomic.LoadInt64(&c))%3 == k {
//			println(n)
//			atomic.AddInt64(&c, 1)
//			a++
//			if a >= 2 {
//				return
//			}
//		}
//	}
//}

//func main() {
//	wg := &sync.WaitGroup{}
//
//	ch1 := make(chan int)
//	ch2 := make(chan int)
//	ch3 := make(chan int)
//
//	wg.Add(3)
//
//	go printNumber(wg, ch1, ch2, 1)
//	go printNumber(wg, ch2, ch3, 2)
//	go printNumber(wg, ch3, ch1, 3)
//
//	ch1 <- 0
//
//	wg.Wait()
//
//	close(ch1)
//	close(ch2)
//	close(ch3)
//
//}
//
//func printNumber(wg *sync.WaitGroup, in, out chan int, n int) {
//	defer wg.Done()
//
//	printCount := 0
//
//	for printCount < 2 {
//		_, ok := <-in
//		if ok {
//			println("number:", n)
//			printCount++
//			out <- 0
//		} else {
//			return
//		}
//	}
//
//	return
//}

//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//

//func main() {
//	var wg sync.WaitGroup
//
//	// 创建三个通道
//	ch1 := make(chan int)
//	ch2 := make(chan int)
//	ch3 := make(chan int)
//
//	// 启动三个协程
//	wg.Add(3)
//	go printNumber(&wg, ch1, ch2, 1, 10)
//	go printNumber(&wg, ch2, ch3, 2, 10)
//	go printNumber(&wg, ch3, ch1, 3, 10)
//
//	// 向第一个协程发送初始信号
//	ch1 <- 0
//
//	// 等待所有协程完成
//	wg.Wait()
//}
//
//func printNumber(wg *sync.WaitGroup, in, out chan int, num, count int) {
//	defer wg.Done()
//
//	for i := 0; i < count; i++ {
//		// 等待来自前一个协程的信号
//		<-in
//
//		// 打印数字
//		fmt.Println(num)
//
//		// 发送信号给下一个协程
//		out <- 0
//	}
//
//	// 关闭通道
//	close(out)
//}
